package cn.whuc.scala.collections

import scala.collection.immutable

object Case02 {
  def main(args: Array[String]): Unit = {
    val datas: List[(String, String, String)] = List(
      ("zhangsan", "湖北", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "鞋"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖南", "衣服"),
      ("wangwu", "湖南", "鞋"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "鞋"),
      ("zhangsan", "湖北", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "帽子"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖南", "衣服"),
      ("wangwu", "湖南", "帽子"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "帽子"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "电脑"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖南", "衣服"),
      ("wangwu", "湖南", "电脑"),
      ("zhangsan", "湖南", "电脑"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "帽子")
    )
    /*
    1、省份和商品一起考虑，每一条数据，计数1
    2、相同省份相同商品进行分组，统计次数
    3、不同省份，商品点击次数，分组
    4、结果整理，排序，输出
   */
    val tuples1: List[((String, String), Int)] = datas.map(tuple => {
      ((tuple._2, tuple._3), 1)
    })
    // 不能使用reduceByKey所以只能先分组，然后通过得到的list的长度，进行计算
    val tupleToTuples: Map[(String, String), List[((String, String), Int)]] = tuples1.groupBy(tuple => {
      tuple._1
    })
    // map中的k不重复 需要转成list
    val list: List[((String, String), Int)] = tupleToTuples.map(t => {
      (t._1, t._2.size)
    }).toList

    //
    val list2: List[(String, (String, Int))] = list.map(t => {
      (t._1._1, (t._1._2, t._2))
    })
    println(list2)
    // 按省份分组，排序
    // 分组就会变map 不能排序 tilist 排序
    val map1: Map[String, List[(String, (String, Int))]] = list2.groupBy(t => t._1)
    println(map1)

    val stringToTuples: Map[String, List[(String, (String, Int))]] = map1.map(t => {
      (t._1, t._2.sortBy(list => {
        list._2._2
      })(Ordering.Int.reverse))
    })

    println(stringToTuples)

    val stringToTuples1: Map[String, List[(String, Int)]] = stringToTuples.map(t => {
      (t._1, t._2.map(list => {
        list._2
      }))
    })

    println(stringToTuples1)
//    val iterable: immutable.Iterable[List[(String, (String, Int))]] = map1.map(t => {
//      t._2.sortBy(list => {
//        list._2._2
//      })
//    })



//    for (elem <- iterable) {
//      println(elem)
//    }

  }


}
